
/*
 *
 * Copyright (c) 2006 P.J.Leonard
 * 
 * http://www.frinika.com
 * 
 * This file is part of Frinika.
 * 
 * Frinika is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.

 * Frinika is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with Frinika; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
package uk.ac.bath.legacy;

import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import uk.ac.bath.util.MyRandom;

/**
 *
 * @author pjl
 */
public class Pallete implements PalleteIF {

    protected Vector<Operator> ops;
    public Value protoValue;

    protected Pallete() {
    }

    public Pallete(Vector<Operator> pal, Value protoValue) {
        ops = pal;
        this.protoValue = protoValue;
    }

    public Operator createRandom() {
        int io = MyRandom.nextInt(ops.size());
        Operator op = null;
        try {
            op = (Operator) (((Operator) (ops.elementAt(io))).clone());

            //   this.protoValue=protoValue;

            if (op instanceof Parametered) {
                Parametered vo = (Parametered) op;
                int nParam = vo.getParamSize();
                for (int i = 0; i < nParam; i++) {
                    Value v = (Value) protoValue.clone();

                    double val = MyRandom.nextDouble();//  * LogicalMachine.maxValue.doubleValue();
                    v.set(val);

                    vo.setParamAt(v, i);
                }
            }
        } catch (CloneNotSupportedException ex) {
            Logger.getLogger(Pallete.class.getName()).log(Level.SEVERE, null, ex);
        }
        return op;

    }

    public VectorState createVector(int size) {
        return new VectorState(size, protoValue);
    }
}
